package com.wen.common.enums;


import org.springframework.lang.Nullable;

import java.util.Objects;

public enum CodeEnum {
    /**
     * 每一个枚举变量都是枚举类 CommonEnum的实例化
     * CommonEnum.SUCCESS获得的对象相当于new CommonEnum("200", "成功!");获得的对象
     */

// 数据操作错误定义
    SUCCESS("200", "成功！"),
    EC_GEN_INTERNAL("201", "失败！"),

    BODY_NOT_MATCH("400", "请求的数据格式不符！"),

    INTERNAL_SERVER_ERROR("500", "服务器内部错误！"),

    NOT_FOUND("404", "未找到该资源！"),

    NOT_SUPPORTED("401", "请求方法不被支持！"),

    SERVER_BUSY("503", "服务器正忙，请稍后再试！"),

    // 客户端认证异常
    CLIENT_AUTH_ERROR("4001", "客户端认证失败！"),

    SIGNATURE_NOT_MATCH("401", "请求的数字签名不匹配！"),

    NOT_RUNNING("-1", "运行时异常！"),

    /* 用户模块 */
    USER_NOT_LOGGED_IN("1001", "用户未登录！"),
    USER_LOGGED_IN("1002", "用户已被登录！"),
    USER_NOT_EXIST("1003", "用户不存在！"),
    USER_EXIST("1004", "用户已存在！"),
    USER_PASSWORD_WRONG("1005", "用户名或密码错误！"),
    USER_NOT_BIND("1006", "用户未绑定电子邮件！"),
    USER_ALREADY_BIND("1007", "该电子邮件已被绑定！"),
    USER_TOKEN_EXPIRED("1008", "token已过期！"),
    USER_ADD_FAIL("1009", "发送电子邮件失败！"),
    USER_ADD_SUCCESS("1010", "发送电子邮件成功！"),
    USER_DELETE_FAIL("1011", "删除电子邮件失败！"),
    USER_DELETE_SUCCESS("1012", "删除电子邮件成功！"),
    USER_PERMISSIONS_EXCEPTION("1013", "用户权限异常！"),
    USER_NOT_PERMISSIONS("1014", "用户没有该权限！"),
    USER_ROLE_ADD_FAIL("1015", "添加角色失败！"),
    USER_ROLE_ADD_SUCCESS("1016", "添加角色成功！"),
    USER_ROLE_DELETE_FAIL("1017", "删除角色失败！"),
    USER_ROLE_DELETE_SUCCESS("1018", "删除角色成功！"),
    USER_ROLE_NOT_EXIST("1019", "用户角色不存在！"),
    USER_NAME_PASSWD_ERROR("1020", "用户名或密码错误！"),
    // 用户账号锁定
    USER_LOCK("1021", "用户账号已被锁定！"),
    USER_IS_DELETE("1022", "用户已被删除！"),
    // 认证异常
    USER_AUTHENTICATION_FAIL("1023", "认证身份异常！"),
    // 授权异常
    USER_AUTHORIZATION_FAIL("1025", "权限验证异常！"),

    // 无效的token
    USER_TOKEN_INVALID("1024", "token无效或已过期！"),


    TEST;

    private static final CodeEnum[] VALUES;

    static {
        /**枚举中默认有两个静态的方法：values() ，valueOf() */
        VALUES = values();
        CodeEnum codeEnum = valueOf("SUCCESS");
    }

    //错误码
    private String resultCode;
    //错误描述
    private String resultMsg;

    CodeEnum() {
    }


    CodeEnum(String resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }

    @Nullable
    public static CodeEnum resolve(String statusCode) {
        for (CodeEnum status : VALUES) {
            if (Objects.equals(status.resultCode, statusCode)) {
                return status;
            }
        }
        return null;
    }

    public String getResultCode() {
        return resultCode;
    }

    public String getResultMsg() {
        return resultMsg;
    }

    /**
     * 枚举中的普通方法
     */
    public void test() {
    }

    /**
     * 枚举结构 字节码中默认继承了Enum类。这是父类中两个的方法
     */
    public void supperTest() {
        int i = compareTo(CodeEnum.SUCCESS);
        CodeEnum codeEnum = valueOf(CodeEnum.class, "SUCCESS");
    }

    /** 枚举中也可以有抽象方法，但enum不能用abstract修饰 需要在枚举项里面实现 */
//    public abstract void test1();


}
